<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 继承 就是让一个函数拥有另外一个函数的属性和方法
        // 在实例化对象中 可以直接使用实例本身以及其原型上面的属性和方法 如果对象本身没有就会去他的原型上找 
        // 如果原型上也没有就回去原型的原型上去找，
        // 以此类推知道错误或者属性值为undefined或者找到为止 这个寻找的过程就叫做原型链
        // 我们下面这种继承方法交原型链继承
        function Game(name) {
            this.name = name
            this.say = function() {
                console.log('欢迎来到' + this.name);
            }
        }

        Game.prototype.play = function() {
            console.log('播放进场动画')
        }

        let wzry = new Game('王者荣耀')
            // wzry.say()
            // console.log(wzry);
            //构造函数的实例化对象中会有一个对象 __proto__ 指向 函数的prototype属性
        console.log(wzry.__proto__ === Game.prototype);

        function Role(roleName, hit, sex) {
            this.roleName = roleName
            this.hit = hit
            this.sex = sex
            this.dance = function() {
                console.log('给我来一段');
            }
        }
        // console.log(Role.prototype);

        // let role = new Role('李白', '70', '男')
        // console.log(role);

        Role.prototype = new Game('王者荣耀')
        Role.prototype.constructor = Role
        let role = new Role('李白', '70', '男')
        console.log(role);
        // console.log('我叫' + role.roleName + '我来自' + role.game.name);
        // role.game.say()
        // role.dance()
        // console.log(role.say);
        role.say()
            // console.log(role.tel);

        // __proto__ prototype constructor的三角关系
        /**
         * 函数在声明时会生成一个对象prototype 该对象中有一个constructor指向构造函数本身 当构造函数实例化后，
         * 在实例化对象中会生成一个对象叫__proto__指向构造函数的prototype
         * */
    </script>
</body>

</html>